﻿using FlyingCircusWebIS.Controllers.Utilidades;
using FlyingCircusWebIS.Filtros;
using FlyingCircusWebIS.Models;
using FlyingCircusWebIS.ViewModels.FormaPagamentoVM;
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Controllers
{
    [AutenticacaoFilter("A")]
    public class FormaPagamentoController : Controller
    {

        private IFormaPagamentoService formaPagamentoService;

        public FormaPagamentoController()
        {
            formaPagamentoService = new FormaPagamentoService();
        }


        public ActionResult Index()
        {
            FormaPagamentoIndexVM vm = ConstruirIndexVM();
            return View(vm);
        }

        public ActionResult Form(int? id)
        {
            FormaPagamentoFormVM vm;
            if (id.HasValue)
            {
                vm = ConstruirFormVMParaEdicao(id.Value);
                if (vm == null)
                    return new HttpNotFoundResult();
            }
            else
            {
                vm = ConstruirFormVMParaNovo();
            }

            return View(vm);
        }

        [HttpPost]
        public ActionResult Form(FormaPagamentoFormVM vm)
        {
            if (ModelState.IsValid)
            {
                FormaPagamento registro = ConverterFormVM(vm);

                var erros = formaPagamentoService.ValidarEntidade(registro);
                if (erros.Count == 0)
                {
                    if (vm.Edicao)
                        formaPagamentoService.Atualizar(registro);
                    else
                        formaPagamentoService.Adicionar(registro);

                    return RedirectToAction("Index");
                }
                else
                {
                    ModelState.AddModelErrors(erros);
                }
            }


            return View(vm);
        }

        public JsonResult Remover(int id)
        {
            JsonActionResultModel jarm = new JsonActionResultModel();

            var erros = formaPagamentoService.ValidaRemoverPorId(id);
            if (erros.Count == 0)
            {
                formaPagamentoService.RemoverPorId(id);
                jarm.Erro = false;
                jarm.Mensagem = "Registro removido com sucesso!";
            }
            else
            {
                jarm.Erro = true;
                jarm.Mensagem = "Não é possível remover o registro.\n";
                jarm.AddValidationResultErros(erros);
            }

            return Json(jarm);
        }

        public JsonResult Desativar(int id)
        {
            formaPagamentoService.DesativarPorId(id);
            return Json(new JsonActionResultModel("Registro desativado com sucesso."));
        }

        public JsonResult Ativar(int id)
        {
            formaPagamentoService.AtivarPorId(id);
            return Json(new JsonActionResultModel("Registro ativado com sucesso."));
        }


        // -----------------------------------------------------------------------------------------
        // Métodos auxiliares 
        // -----------------------------------------------------------------------------------------


        private FormaPagamentoFormVM ConstruirFormVMParaNovo()
        {
            return new FormaPagamentoFormVM() { Edicao = false, FlagAtivo = true };
        }

        private FormaPagamentoFormVM ConstruirFormVMParaEdicao(int id)
        {
            FormaPagamento registro = formaPagamentoService.BuscarPorId(id);
            if (registro != null)
            {
                FormaPagamentoFormVM vm = ConverterFormVM(registro);
                vm.Edicao = true;
                return vm;
            }

            return null;
        }


        private FormaPagamento ConverterFormVM(FormaPagamentoFormVM vm)
        {
            FormaPagamento registro = new FormaPagamento();
            registro.IdPagamento = vm.IdPagamento;
            registro.Descricao = vm.Descricao;
            registro.FlagAtivo = (vm.FlagAtivo ? "S" : "N");

            return registro;
        }


        private FormaPagamentoFormVM ConverterFormVM(FormaPagamento registro)
        {
            FormaPagamentoFormVM vm = new FormaPagamentoFormVM();
            vm.IdPagamento = registro.IdPagamento;
            vm.Descricao = registro.Descricao;
            vm.FlagAtivo = registro.FlagAtivo.Equals("S");

            return vm;
        }

        private FormaPagamentoIndexVM ConstruirIndexVM()
        {
            List<FormaPagamento> registros = formaPagamentoService.Listar();

            FormaPagamentoIndexVM vm = new FormaPagamentoIndexVM();
            vm.Registros = registros;
            vm.TotalRegistros = registros.Count;
            return vm;
        }



    }
}
